1.flask-sqlalchemy 的介绍
- flask-sqlalchemy 简化了 sqlalchemy 在 Flask 中的操作
2.flask-sqlalchemy 的安装
pip3 install flask-sqlalchemy -i https://pypi.douban.com/simple # 使用豆瓣的镜像
3.flask-sqlalchemy 的使用
# app.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
# 实例化 SQLAlchemy -> 一定要设置为全局变量,且在视图文件和models文件上面
db = SQLAlchemy() # 创建 SQLAlchemy 所用到的所有东西的一个对象,唯独少了数据库连接
from models import * # 如果不导入 flask_sqlalchemy 就不会创建表,因为 models.py 没有被执行
app = Flask(__name__)
app.config.from_object('settings.ProConfig') # 设置配置文件
# 从app配置文件中获取相关的 SQLAlchemy 配置
db.init_app(app) # 通过读取app的配置文件获取到数据库的连接
@app.route('/home')
def home():
# 添加数据
# db.session.add(Users(name='Kevin', age=18, address='横沥'))
# db.session.commit()
# db.session.remove()
# 查询数据
result = db.session.query(Users.name, Users.age).all()
print(result)
db.session.remove()
return '首页'
if __name__ == '__main__':
app.run()
# flask-sqlalchemy 的所有配置项和默认值
app.config.setdefault('SQLALCHEMY_DATABASE_URI', 'sqlite:///:memory:') # 连接那个数据库
app.config.setdefault('SQLALCHEMY_BINDS', None)
app.config.setdefault('SQLALCHEMY_NATIVE_UNICODE', None)
app.config.setdefault('SQLALCHEMY_ECHO', False)
app.config.setdefault('SQLALCHEMY_RECORD_QUERIES', None)
app.config.setdefault('SQLALCHEMY_POOL_SIZE', None) # 连接池中的连接数
app.config.setdefault('SQLALCHEMY_POOL_TIMEOUT', None) # 连接池中没有线程后最多等待的时间(单位:秒),如果超过指定时间还没有连接就报错
app.config.setdefault('SQLALCHEMY_POOL_RECYCLE', None) # 多久之后对线程池中的线程进行一次连接的回收(重置)(单位:秒)-> -1表示不重置
app.config.setdefault('SQLALCHEMY_MAX_OVERFLOW', None) # 允许溢出多少个连接(即:连接池的连接已满后,还可以创建多少条连接)
app.config.setdefault('SQLALCHEMY_COMMIT_ON_TEARDOWN', False)
# settings.py
class BaseConfig(object):
# SQLAlchemy 配置
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:@127.0.0.1:3306/db1?charset=utf8'
SQLALCHEMY_MAX_OVERFLOW = 10 # 允许溢出多少个连接(即:连接池的连接已满后,还可以创建多少条连接)
SQLALCHEMY_POOL_SIZE = 5 # 连接池中的连接数
SQLALCHEMY_POOL_TIMEOUT = 10 # 连接池中没有线程后最多等待的时间(单位:秒),如果超过指定时间还没有连接就报错
SQLALCHEMY_POOL_RECYCLE = -1 # 多久之后对线程池中的线程进行一次连接的回收(重置)(单位:秒)-> -1表示不重置
class ProConfig(BaseConfig):
pass
# models.py
from sqlalchemy import Column, Integer, VARCHAR
from app import db
# Users 表的类
class Users(db.Model): # 创建表的类一定要继承 db.Model
__tablename__ = 'users' # 表名
id = Column(Integer, primary_key=True, autoincrement=True) # 整型 设置主键 设置自增列
name = Column(VARCHAR(32), nullable=False, index=True) # varchar类型(长度:32) 不允许为空 将name字段设置为索引
age = Column(Integer) # 整形
address = Column(VARCHAR(32)) # varchar类型(长度:32)
- 通过离线文件创建或删除表(即: 需要单独运行该py文件)
- flask-sqlalchemy 不支持修改表,需要使用第三方模块(即: flask-migrate)
# create_table.py
from app import db, app
app_ctx = app.app_context() # app_ctx = app/g
with app_ctx: # 当 with 对象的时候,就会执行该对象所在的类中的 __enter__ 和 __exit__ 方法
# app_ctx 所在的类中的 __enter__ 方法的作用: 通过 LocalStack 放入 Local 中
# 创建表
db.create_all() # 相当于执行原 SQLAlchemy 的 create_all
# 会先去指定上下文中找到app,然后找到app的配置文件中的 flask-sqlalchemy 相关配置,最终生成数据库表
# 删除表
# db.drop_all()
# app_ctx 所在的类中的 __enter__ 方法的作用: 移除移除Local中你所放入的 app_ctx 对象
← flask-script 模块 g →